package main

import (
	"fmt"
	"sync"
	"time"
)

// worker 函数接受一个 int 类型的 id 和一个指向 sync.WaitGroup 的指针
func worker(id int, wg *sync.WaitGroup) {
	defer wg.Done() // 函数结束时减少 WaitGroup 的计数器
	fmt.Printf("Worker %d starting\n", id)
	time.Sleep(time.Second) // 模拟一些工作
	fmt.Printf("Worker %d done\n", id)
}

func main() {
	var wg sync.WaitGroup

	for i := 1; i <= 5; i++ {
		wg.Add(1)         // 增加 WaitGroup 的计数器
		go worker(i, &wg) // 启动 worker goroutine 并传递 WaitGroup 的指针
	}

	wg.Wait() // 阻塞主 goroutine，直到 WaitGroup 的计数器变为零
	fmt.Println("All workers completed")
}

// 注释：
// worker函数定义为func worker(id int, wg *sync.WaitGroup)，其中wg *sync.WaitGroup表示wg是一个指向sync.WaitGroup类型的指针。
// go worker(i, &wg)中，&wg表示取wg变量的地址，并将其传递给worker函数。
// 在worker函数内部，defer wg.Done()通过指针wg调用Done方法，从而减少WaitGroup的计数器。
